<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-GB" xml:lang="en-GB">
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="pandoc" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <title>uihelpvars</title>
  <style>
  html {font-family: Hoefler Text, Palatino, Georgia, serif;
    color: #1a1a1a;
    background-color: #fdfdfd;}

  body {margin: 0 auto;
    max-width: 40em;
    padding-left: 15px;
    padding-right: 15px;
    padding-top: 5px;
    padding-bottom: 5px;
    hyphens: auto;
    overflow-wrap: break-word;
    text-rendering: optimizeLegibility;
    font-kerning: normal;
  }

  @media (max-width: 600px) {body {font-size: 0.9em;
    padding: 1em;}
    h1 {font-size: 1.8em;}
  }

  @media print {body {background-color: transparent;
    color: black;
    font-size: 12pt;}
    p, h2, h3 {	orphans: 3;
    widows: 3;}
    h2, h3, h4 {	page-break-after: avoid;}
  }

  header {display: none;}
  kbd {margin: 0px 0.1em;
    padding: 0.1em 0.6em;
    border-radius: 3px;
    border: 1px solid rgb(204, 204, 204);
    color: rgb(51, 51, 51);
    line-height: 1.4;
    font-family: Menlo, monospace;
    font-size: 11px;
    display: inline-block;
    box-shadow: 0px 1px 0px rgba(0,0,0,0.3);
    background-color: rgb(247, 247, 247);
    text-shadow: 0 1px 0 #fff;
  }
  kbd:hover {box-shadow: 0 1px 0 0.5px;}
  p {font-size: 18px;margin: 0.8em 0;line-height: 1.5;}
  a {color: #1a1a1a;}
  a:visited {color: #1a1a1a;}
  img {max-width: 100%;}
  h1, h2, h3, h4, h5, h6 {margin-top: 1.4em;}
  h5, h6 {font-size: 1em;
  font-style: italic;}
  h6 {font-weight: normal;}
  ol, ul {font-size: 18px;
    line-height: 1.2em;
    padding-left: 1.7em;
    margin-top: 1em;}
  li > ol, li > ul {margin-top: 0;}
  blockquote {margin: 1em 0 1em 1.7em;
    padding-left: 1em;
    border-left: 2px solid #e6e6e6;
    color: #606060;
    font-style: italic;}
  code {font-family: Fira Code, Menlo, Consolas, monospace;
    font-size: 14px;
    margin: 0;
    background-color: #F0F0F0;
    color:rgb(145, 16, 42);
  }
  pre {margin: 1em 0;
    overflow: auto;
  }
  pre code {padding: 0;
    overflow: visible;
    overflow-wrap: normal;
    background-color:transparent;
    color: black;
  }
  pre.smaller code {font-size: 60% !important; line-height: .75rem !important;}
  .sourceCode {background-color: transparent;
    overflow: visible;
  }
  hr {background-color: #1a1a1a;
    border: none;
    height: 1px;
    margin: 1em 0;
  }
  table {margin: 1em 0;
    border-collapse: collapse;
    width: 100%;
    overflow-x: auto;
    display: block;
    font-variant-numeric: lining-nums tabular-nums;
  }
  table caption {margin-bottom: 0.75em;}
  tbody {margin-top: 0.5em;
    border-top: 1px solid #1a1a1a;
    border-bottom: 1px solid #1a1a1a;
  }
  th {border-top: 1px solid #1a1a1a;
    padding: 0.25em 0.5em 0.25em 0.5em;
  }
  td {padding: 0.125em 0.5em 0.25em 0.5em;}
  header {margin-bottom: 4em;
    text-align: center;
  }
  #TOC li {list-style: none;}
  #TOC ul {padding-left: 1.3em;}
  #TOC > ul {padding-left: 0;}
  #TOC a:not(:hover) {text-decoration: none;}
  code{white-space: pre-wrap;}
  span.smallcaps{font-variant: small-caps;}
  span.underline{text-decoration: underline;}
  div.column{display: inline-block; vertical-align: top; width: 50%;}
  div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
  ul.task-list{list-style: none;}
  pre > code.sourceCode { white-space: pre; position: relative;}
  pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
  pre > code.sourceCode > span:empty { height: 1.2em; }
  .sourceCode { overflow: visible; }
  code.sourceCode > span { color: inherit; text-decoration: inherit; }
  div.sourceCode { margin: 2em 0; }
  pre.sourceCode { margin: 0; }
  @media screen {
  div.sourceCode { overflow: auto; background-color: #F0F0F0;}
  }
  @media print {
  pre > code.sourceCode { white-space: pre-wrap;}
  pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
  }
  pre.numberSource code
    { counter-reset: source-line 0; }
  pre.numberSource code > span
    { position: relative; left: -4em; counter-increment: source-line; }
  pre.numberSource code > span > a:first-child::before
    { content: counter(source-line);
      position: relative; left: -1em; text-align: right; vertical-align: baseline;
      border: none; display: inline-block;
      -webkit-touch-callout: none; -webkit-user-select: none;
      -khtml-user-select: none; -moz-user-select: none;
      -ms-user-select: none; user-select: none;
      padding: 0 4px; width: 4em;
      color: #aaaaaa;
    }
  pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa;  padding-left: 4px; }
  @media screen {
  pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
  }
  code span.al { color: #ff0000; font-weight: bold; } /* Alert */
  code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
  code span.at { color: #7d9029; } /* Attribute */
  code span.bn { color: #40a070; } /* BaseN */
  code span.bu { color: #008000; } /* BuiltIn */
  code span.cf { color: #0044a3; font-weight: bold; } /* ControlFlow */
  code span.ch { color: #4070a0; } /* Char */
  code span.cn { color: #880000; } /* Constant */
  code span.co { color: #779097; font-style: italic; } /* Comment */
  code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
  code span.do { color: #ba2121; font-style: italic; } /* Documentation */
  code span.dt { color: #902000; } /* DataType */
  code span.dv { color: #40a070; } /* DecVal */
  code span.er { color: #ff0000; font-weight: bold; } /* Error */
  code span.fl { color: #40a070; } /* Float */
  code span.fu { color: #06287e; } /* Function */
  code span.im { color: #008000; font-weight: bold; } /* Import */
  code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
  code span.kw { color: #00338a; font-weight: bold; } /* Keyword */
  code span.op { color: #666666; } /* Operator */
  code span.ot { color: #007020; } /* Other */
  code span.pp { color: #bc7a00; } /* Preprocessor */
  code span.sc { color: #4070a0; } /* SpecialChar */
  code span.ss { color: #bb6688; } /* SpecialString */
  code span.st { color: #4070a0; } /* String */
  code span.va { color: #201f45; } /* Variable */
  code span.vs { color: #4070a0; } /* VerbatimString */
  code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
  .display.math{display: block; text-align: center; margin: 0.5rem auto;}
  </style>
</head>
<body>
<h1 id="configuring-variables">Configuring Variables</h1>
<p>Opticka uses the taskSequence class to specify one or more variable
names and values [<code>nVar</code>] that can be randomised using
balanced blocked repetition and applied to one or multiple stimuli
during a task. The taskSequence class can also specify independent trial
level [<code>trialVar</code>] and block level [<code>blockVar</code>]
randomisation values. In addition, you can add a staircase (needs
Palamedes toolbox), to run alongside the taskSequence (see the
<code>Saccadic Countermanding</code> core protocol for an example of
using a staircase).</p>
<h1 id="variable-modifiers">Variable modifiers</h1>
<p>Variables can have modifiers, best explained by example:</p>
<ol type="1">
<li>Name = <code>angle</code></li>
<li>Values = <code>[-90 0 90]</code></li>
<li>Affects = <code>1</code></li>
<li>Modifier = <code>2; 90</code></li>
</ol>
<p>In this case, angle is varied -90° 0° 90° for stimulus 1. Stimulus 2
has the modifier 90 applied, so for example if stimulus 1 =
<code>-90°</code> then stimulus 2 = <code>-90° + 90° = 0°</code>.</p>
<p>Modifiers can also be string commands:</p>
<ol type="1">
<li><code>2; 'shift(2)'</code> - shift +2 places in the Value list. For
example say for stimulus 1
<code>Values = [-90 -45 0 45 90 135 180]</code> and for this trial the
fourth value <code>45</code> is randomly selected. For stimulus 2 we
then shift two places to fetch the sixth value <code>135</code>. Shift
wraps from end to start (e.g. if seventh value <code>180</code> was
selected for stimulus 1 then second value <code>-45</code> would be
selected for stimulus 2), and you can use negative values
(<code>-1</code> would select the third place <code>0</code> for
example).</li>
<li><code>2; 'invert'</code> — take the current value and invert it, so
if the current value is <code>+10°</code> then invert will make stimulus
2 <code>-10°</code>.</li>
<li><code>2; 'xvar(10, 0.5)'</code> — For <code>xyPosition</code>
variables you can add a variable x position. In this case whatever the X
position is, <code>xvar(10)</code> will add or subtract (50%
probability) 10°. So for example if X position is <code>0°</code> then
the modifier could result in <code>+10°</code> or <code>-10°</code> with
a 50% probability. Change <code>0.5</code> to change the
probability.</li>
<li><code>2; 'yvar(10, 0.5)'</code> — Same as <code>xvar</code> but for
Y axis.</li>
<li><code>2; 'xoffset(5)'</code> — For <code>xyPosition</code> add a
fixed X position offset, so in this case add 5° to whatever value the X
axis position is.</li>
<li><code>2; 'xoffset(5)'</code> — For <code>xyPosition</code> add a
fixed X position offset, so in this case add 5° for stimulus 2 to
whatever value the X axis position is of stimulus 1.</li>
<li><code>2; 'yoffset(5)'</code> — For <code>xyPosition</code> add a
fixed Y position offset, so in this case add 5° for stimulus 2 to
whatever value the Y axis position is of stimulus 1.</li>
</ol>
<h1 id="block-and-trial-level-independent-factors">Block and Trial level
independent factors</h1>
<p>You can set [Block Values] and [Trial Values] in the UI and assign
probabilities. These are assigned independently of any variables. So for
example setting trial values: <code>{'a','b'}</code> trial
probabilities: <code>{0.3 0.7}</code> would randomly assign either
<code>a</code> or <code>b</code> in a 30:70 proability to each trial.
Block factors have the same assignation, but applies over the blocks. So
for example say we have a variable with two values (-10 or +10 degrees)
and 5 repeat blocks. The trials are randomised. Separately we assign
<code>{'a','b'}</code> to trials and <code>{'x','y'}</code> to get an
experiment table of 5 blocks that may look like thislike this:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">Var</th>
<th style="text-align: center;">Idx</th>
<th style="text-align: right;">TrialV</th>
<th style="text-align: center;">BlockV</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">10</td>
<td style="text-align: center;">2</td>
<td style="text-align: right;">b</td>
<td style="text-align: center;">y</td>
</tr>
<tr>
<td style="text-align: center;">-10</td>
<td style="text-align: center;">1</td>
<td style="text-align: right;">b</td>
<td style="text-align: center;">y</td>
</tr>
<tr>
<td style="text-align: center;">10</td>
<td style="text-align: center;">2</td>
<td style="text-align: right;">a</td>
<td style="text-align: center;">x</td>
</tr>
<tr>
<td style="text-align: center;">-10</td>
<td style="text-align: center;">1</td>
<td style="text-align: right;">b</td>
<td style="text-align: center;">x</td>
</tr>
<tr>
<td style="text-align: center;">10</td>
<td style="text-align: center;">2</td>
<td style="text-align: right;">a</td>
<td style="text-align: center;">x</td>
</tr>
<tr>
<td style="text-align: center;">-10</td>
<td style="text-align: center;">1</td>
<td style="text-align: right;">b</td>
<td style="text-align: center;">x</td>
</tr>
<tr>
<td style="text-align: center;">10</td>
<td style="text-align: center;">2</td>
<td style="text-align: right;">a</td>
<td style="text-align: center;">x</td>
</tr>
<tr>
<td style="text-align: center;">-10</td>
<td style="text-align: center;">1</td>
<td style="text-align: right;">b</td>
<td style="text-align: center;">x</td>
</tr>
<tr>
<td style="text-align: center;">10</td>
<td style="text-align: center;">2</td>
<td style="text-align: right;">a</td>
<td style="text-align: center;">y</td>
</tr>
<tr>
<td style="text-align: center;">-10</td>
<td style="text-align: center;">1</td>
<td style="text-align: right;">a</td>
<td style="text-align: center;">y</td>
</tr>
</tbody>
</table>
<h2 id="log-or-linear-interpolation-buttons">Log or Linear interpolation
buttons</h2>
<p>You can enter 3 values, <code>start | end | steps</code>, and press
the <kbd>log</kbd> or the <kbd>lin</kbd> buttons to interpolate a log or
linear range, for example <code>1 2 5</code> would get converted to
<code>1 1.1892 1.4142 1.6818 2</code> when pressing the <kbd>log</kbd>
button.</p>
<h2 id="equidistant-points-button">Equidistant Points button</h2>
<p>This small tool allows you to specify the number of points, distance
from center and additional rotation to calculate the correct X and Y
positions. For example if you specified 8 points with 12° from the
center the tool would calculate
<code>{[12 0], [8.49 8.49], [0 12], [-8.49 8.49], [-12 0], [-8.49 -8.49], [0 -12], [8.49 -8.49]}</code>
for the <code>xyPosition</code> values.</p>
</body>
</html>
